package com.example.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.constant.UserExceptionEnum;
import com.example.domain.SysUser;
import com.example.exception.BizException;
import com.example.mapper.SysUserMapper;
import com.example.service.SysUserService;
import com.example.vo.req.SysUserVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
* @author dlg
* @description 针对表【sys_user(用户信息表)】的数据库操作Service实现
* @createDate 2024-08-21 10:55:27
*/
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
    implements SysUserService{

    @Override
    public SysUserVo getUser(String id) {
        throw new BizException(UserExceptionEnum.USER_LOCKED);
    }

    /**
     * 调用方有事务，加入事务
     * 调用方无事务，创建新事务，将当前方法放入新事物中
     */
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void testTranRequired() {

    }

    /**
     * 调用方有事务，挂起调用方事务（可能会造成死锁），创建新事务，将当前方法放入新事物中，
     * 调用方无事务，创建新事务，将当前方法放入新事物中
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void testTranRequiredNew() {

    }

    /**
     * 当前方法需要以非事务方式运行，如果调用方存在事务会抛出异常
     */
    @Transactional(propagation = Propagation.NEVER)
    @Override
    public void testTranNever() {

    }

    /**
     * 调用方存在事务，则创建一个新事务，并且作为调用方事务的嵌套事务
     * 调用方不存在事务，则创建新事务，并把当前方法加入新事务中
     */
    @Transactional(propagation = Propagation.NESTED)
    @Override
    public void testTranNested() {
        SysUser sysUser = new SysUser();
        sysUser.setId(1650308201147654145L);
        sysUser.setDeptId(2L);

        baseMapper.updateById(sysUser);
    }

    @Transactional(propagation = Propagation.NESTED)
    @Override
    public void testTranNested2() {
        SysUser sysUser = new SysUser();
        sysUser.setId(1650308201147654145L);
        sysUser.setDeptId(3L);
        baseMapper.updateById(sysUser);
        int i = 1 / 0;
    }

    /**
     * 调用方存在事务，则加入
     * 调用方不存在事务，当前方法以非事务运行
     */
    @Override
    public void testTranSupported() {

    }

    /**
     * 若调用方存在事务，则挂起调用方事务，当前方法以非事务方式运行
     * 调用方不存在事务，当前方法以非事务运行
     */
    @Override
    public void testTranNotSupported() {

    }

    /**
     * 调用方存在事务则加入
     * 调用方不存在事务，抛出异常
     */
    @Override
    public void testTranMandatory() {

    }
}




